from datetime import datetime,timedelta

from flask import abort
from flask import flash, jsonify

from flask import current_app
from flask import g
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import url_for
from sqlalchemy import extract

from info import constants
from info import db
from info.models import User
from info.modules.admin import admin_blu
from info.utils.commons import admin_login_required, login_user_data
from info.utils.response_code import RET


@admin_blu.route('/user/list')
@admin_login_required
def user_list():
    """
    后台管理用户列表信息页面:
    """
    # 1. 获取参数并进行校验
    page = request.args.get('p', 1)

    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        abort(404)

    # 2. 获取所有普通用户信息并进行分页
    try:
        pagination = User.query.filter(User.is_admin == False).\
            order_by(User.create_time.desc()).\
            paginate(page, constants.ADMIN_USER_PAGE_MAX_COUNT, False)
        users = pagination.items
        total_page = pagination.pages
        current_page = pagination.page
    except Exception as e:
        current_app.logger.error(e)
        abort(500)

    # 3. 使用模板文件
    return render_template('admin/user_list.html',
                           users=users,
                           total_page=total_page,
                           current_page=current_page)


@admin_blu.route('/user/count')
@admin_login_required
def user_count():
    """
    后台管理用户信息统计页面
    """
    # 统计网站用户总数
    total_count=User.query.filter(User.is_admin==False).count()
    # 统计当月新增用户数量
    now_date=datetime.now()
    year= now_date.year
    month= now_date.month

    month_count=db.session.query(User).filter(extract('year',User.create_time)==year,
                                              extract('month',User.create_time)==month).count()
    # 统计当天新增用户
    day = now_date.day
    day_count=db.session.query(User).filter(extract('year',User.create_time)==year,
                                            extract('month',User.create_time)==month,
                                            extract('day',User.create_time)==day).count()
    # 统计近31天每天增加的用户数量
    date_li=[]
    day_counts=[]
    # 计算今天的前30天前是'几月几号'
    begin_date= now_date - timedelta(days=30)
    # 遍历近30 天每天增加的用户数量
    for i in range(0,31):
        cur_date= begin_date + timedelta(days=i)
        year=cur_date.year
        month=cur_date.month
        day=cur_date.day
    # 统计当天新增用户量
        count=db.session.query(User).filter(extract('year',User.create_time)==year,
                                            extract('month',User.create_time)==month,
                                            extract('day',User.create_time)==day).count()
        # 将date提么类型格式化为字符串内容
        begin_date_str=cur_date.strftime('%Y-%m-%d')
        # 将对应日期添加到date_li列表中
        date_li.append(begin_date_str)
        # 将对应日期增加的用户数量添加到days_counts中
        day_counts.append(count)
    # 使用模板
    return render_template('admin/user_count.html',
                           total_count=total_count,
                           month_count=month_count,
                           day_count=day_count,
                           date_li=date_li,
                           day_counts=day_counts)





@admin_blu.route('/logout',methods=["POST"])
def logout():
    """
       管理员退出登录:
       清除session中的对应登录之后保存的信息
       """
    session.pop('user_id')
    session.pop('nick_name')
    session.pop('mobile')
    session.pop('is_admin')
    # 返回结果
    return jsonify(errno=RET.OK,errmsg='ok')


@admin_blu.route('/login',methods=['POST','GET'])
@login_user_data
def login():
    """后台登陆页面"""
    if request.method=="GET":
        # 显示后台管理页面
        # 从g变量中获取user
        user = g.user
        if user and user.is_admin:
            return redirect(url_for('admin.index'))
        return render_template('admin/login.html')
    else:
        # 进行后台登录判断
        # 1. 接收参数并进行参数校验
        username=request.form.get("username")
        password=request.form.get("password")
        if not all([username,password]):
            flash('参数不足')
            return redirect(url_for('admin.login'))
        # 2. 根据用户名查询管理员信息
        try:
            user = User.query.filter(User.nick_name == username, User.is_admin == True).first()
        except Exception as e:
            current_app.logger.error(e)
            flash('数据查询失败')
            return redirect(url_for('admin.login'))
        if not user:
            flash("管理员不存在")
            return redirect(url_for('admin.login'))
        # 3. 判断管理员的密码是否正确
        if not user.check_passowrd(password):
            flash('用户名或密码错误')
            return redirect(url_for('admin.login'))
        # 4.在session中记录用户的登录状态
        session['user_id']=user.id
        session['nick_name'] = user.nick_name
        session['mobile'] = user.mobile
        session['is_admin'] = True
        # 5. TODO 登录成功，跳转到后台管理首页
        return redirect(url_for("admin.index"))


@admin_blu.route('/index')
@admin_login_required
def index():
    """
    管理员后台首页:
    """
    # 从g变量中获取登录user
    user = g.user
    return render_template('admin/index.html', user=user)